#pragma once

#include "stdafx.h"
#include <string.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

const int TAMANHO_ARQUIVO = 500;
const string PATH = "D:\\ArquivoCircular.txt";
const string ESPACO = "--";

class ArquivoCircular
{
	int posicao;
	int posicaoLeitura;
	string conteudo[TAMANHO_ARQUIVO];
	HANDLE ghArquivo;

	void Carrega();
	void Grava();

public:
	ArquivoCircular();
	void AdicionaRegistro(string);
	string Consome();
};

ArquivoCircular::ArquivoCircular()
{
	posicao = 0;
	posicaoLeitura = 0;
	ghArquivo = CreateMutex(NULL, false, NULL);
	for (int i = 0; i < TAMANHO_ARQUIVO; i++)
	{
		conteudo[i] = ESPACO;
	}
	Grava();
}

void ArquivoCircular::Carrega()
{
	ifstream arquivo(PATH);
	string linha;

	for(int i = 0; i < TAMANHO_ARQUIVO; i++)
	{
		getline(arquivo, linha);
		conteudo[i] = linha;
	}
	arquivo.close();
}

void ArquivoCircular::Grava()
{
	ofstream arquivo;
	arquivo.open(PATH, ios::trunc);
	for (int i = 0; i < TAMANHO_ARQUIVO; i++)
	{
		arquivo << conteudo[i] << "\n";
	}
	arquivo.close();
}

void ArquivoCircular::AdicionaRegistro(string msg)
{
	WaitForSingleObject(ghArquivo, INFINITE);
	conteudo[posicao] = msg;
	posicao++;
	Grava();
	ReleaseMutex(ghArquivo);
}

string ArquivoCircular::Consome()
{
	WaitForSingleObject(ghArquivo, INFINITE);
	Carrega();
	string linha = conteudo[posicaoLeitura];
	posicaoLeitura++;
	ReleaseMutex(ghArquivo);
	return linha;
}